package com.csx.framework.springboot.sample.boot;

import org.springframework.beans.BeansException;
import org.springframework.context.*;

import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.metrics.ApplicationStartup;
import org.springframework.stereotype.Component;
import org.springframework.util.StringValueResolver;

/**
 * 生效时机:
 *      详细看 {q}, ApplicationContextAwareProcessor 是一个BeanPostProcessor,内部触发了这几个接口的回调
 *      postProcessBeforeInitialization 里面被调用，在Bean初始化之前做操作
 * 使用场景:
 *      ① EnvironmentAware: 用于获取 Environment 的一个扩展类,也可以直接注入获取
 *      ② EmbeddedValueResolverAware: 用于获取StringValueResolver 的一个扩展类,可以获取基于string类型的properties的变量,一般通过 @Value获取
 *      ③ ResourceLoaderAware: 用于获取ResourceLoader的扩展类，ResourceLoader可以获取classpath内所有资源对象
 *      ④ ApplicationEventPublisherAware: 用于获取ApplicationEventPublisher的一个扩展类。ApplicationEventPublisher可以发布事件,结合ApplicationListener来使用
 *      ⑤ MessageSourceAware: 用来获取MessageSource的一个扩展类,用于做国际化
 *      ⑥ ApplicationStartupAware: 用来获取 ApplicationStartup的一个扩展类， ApplicationStartup 用于检测应用程序启动时，核心容器可用时，收集执行的上下文数据或者它们的启动时间
 *      ⑥ ApplicationContextAware: 用来获取ApplicationContext容器对象
 * @author cuisongxu
 * @date 2024/2/25 周日 14:37
 */

@Component
public class F6ApplicationContextAwareProcessor implements EnvironmentAware, EmbeddedValueResolverAware, ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware, ApplicationStartupAware, ApplicationContextAware {


    @Override
    public void setEnvironment(Environment environment) {
        System.out.println("顺序12 --- F6ApplicationContextAwareProcessor#setEnvironment 在Bean初始化之前被调用,可以拿到 Environment 类型对象");
        System.out.println();
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        System.out.println("顺序13 --- F6ApplicationContextAwareProcessor#setEmbeddedValueResolver 在Bean初始化之前被调用,可以拿到 StringValueResolver 类型对象");
        System.out.println();
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        System.out.println("顺序14 --- F6ApplicationContextAwareProcessor#setResourceLoader 在Bean初始化之前被调用,可以拿到 ResourceLoader 类型对象");
        System.out.println();
    }

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        System.out.println("顺序15 --- F6ApplicationContextAwareProcessor#setApplicationEventPublisher 在Bean初始化之前被调用,可以拿到 ApplicationEventPublisher 类型对象");
        System.out.println();

    }

    @Override
    public void setMessageSource(MessageSource messageSource) {
        System.out.println("顺序16 --- F6ApplicationContextAwareProcessor#setMessageSource 在Bean初始化之前被调用,可以拿到 MessageSource 类型对象");
        System.out.println();
    }

    @Override
    public void setApplicationStartup(ApplicationStartup applicationStartup) {
        System.out.println("顺序17 --- F6ApplicationContextAwareProcessor#setApplicationStartup 在Bean初始化之前被调用,可以拿到 ApplicationStartup 类型对象");
        System.out.println();
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("顺序18 --- F6ApplicationContextAwareProcessor#setApplicationContext 在Bean初始化之前被调用,可以拿到 ApplicationContext 类型对象");
        System.out.println();
    }












}
